#pragma once
#include <string>
#include <unordered_map>
// 宏定义的作用：方便以后修改，便于维护
namespace myrpc 
{
    // 请求字段宏定义
    #define KEY_METHOD      "method"        // 请求方法
    #define KEY_PARAMS      "parameters"    // 请求参数
    #define KEY_TOPIC_KEY   "topic_key"     // 主题名称
    #define KEY_TOPIC_MSG   "topic_msg"     // 主题消息
    #define KEY_OPTYPE      "optype"        // 操作类型
    // 主机信息
    #define KEY_HOST        "host"          // 方法名称
    #define KEY_HOST_IP     "ip"            // 主机IP
    #define KEY_HOST_PORT   "port"          // 主机端口

    // 响应字段
    #define KEY_RCODE       "rcode"         // 响应码
    #define KEY_RESULT      "result"        // 相应结果

    // 消息类型 定义
    // enum class MType 
    enum MType 
    {
        REQ_RPC = 0,    // rpc请求
        RSP_RPC,        // rpc响应
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,
        RSP_SERVICE
    };

    // 响应码类型 定义
    // enum class RCode 
    enum RCode 
    {   
        RCODE_OK = 0,               // 成功处理
        RCODE_PARSE_FAILED,         // 解析失败
        RCODE_ERROR_MSGTYPE,        
        RCODE_INVALID_MSG,          // 消息中字段缺失或错误导致⽆效消息
        RCODE_DISCONNECTED,         // 连接断开
        RCODE_INVALID_PARAMS,       // ⽆效的Rpc调⽤参数 
        RCODE_NOT_FOUND_SERVICE,    // Rpc服务不存在 
        RCODE_INVALID_OPTYPE,       // ⽆效的Topic操作类型 
        RCODE_NOT_FOUND_TOPIC,      // 主题不存在
        RCODE_INTERNAL_ERROR        // ⽆效的服务操作类型
    };

    // 具体的错误原因
    static std::string errReason(RCode code) 
    {
        static std::unordered_map<RCode, std::string> err_map = 
        {
            {RCode::RCODE_OK, "成功处理！"},
            {RCode::RCODE_PARSE_FAILED, "消息解析失败！"},
            {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误！"},
            {RCode::RCODE_INVALID_MSG, "无效消息"},
            {RCode::RCODE_DISCONNECTED, "连接已断开！"},
            {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数!"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务！"},
            {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题！"},
            {RCode::RCODE_INTERNAL_ERROR, "内部错误！"}
        };
        auto it = err_map.find(code);
        if (it == err_map.end()) 
        {
            return "未知错误！";
        }
        return it->second;
    }

    // RPC请求类型定义 
    // enum class RType 
    enum RType 
    {
        REQ_ASYNC = 0,      // 异步请求
        REQ_CALLBACK        // 回调请求
    };

    // 主题操作类型 定义 
    // enum class TopicOptype 
    enum TopicOptype 
    {
        TOPIC_CREATE = 0,   // 主题创建
        TOPIC_REMOVE,       // 主题删除
        TOPIC_SUBSCRIBE,    // 主题订阅
        TOPIC_CANCEL,       // 主题取消订阅
        TOPIC_PUBLISH       // 主题消息发布
    };

    // 服务操作类型 定义
    // enum class ServiceOptype 
    enum ServiceOptype 
    {
        SERVICE_REGISTRY = 0,   // 注册
        SERVICE_DISCOVERY,      // 发现
        SERVICE_ONLINE,         // 上线
        SERVICE_OFFLINE,        // 下线
        SERVICE_UNKNOW
    };
}